package thinkingInJava.others;

// http://blog.csdn.net/lufeng20/article/details/24314381
// ThreadLocal 用途
public class ThreadLocalTest {
	// ①通过匿名内部类覆盖ThreadLocal的initialValue()方法，指定初始值
		private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>() {
			public Integer initialValue() {
				return 0;
			}
		};
		
		private Integer ii = 0;
		public int getNextNum2(){
			ii++;
			return ii;
		}

		// ②获取下一个序列值
		public int getNextNum() {
			seqNum.set(seqNum.get() + 1);
			return seqNum.get();
		}

		public static void main(String[] args) {
			ThreadLocalTest sn = new ThreadLocalTest();
			// ③ 3个线程共享sn，各自产生序列号
			TestClient t1 = new TestClient(sn);
			TestClient t2 = new TestClient(sn);
			TestClient t3 = new TestClient(sn);
			t1.start();
			t2.start();
			t3.start();
			// 看运行结果知即使三个线程共用一个对象，但实际上每个线程中的seqNum的值是分开的，而ii是共用的。
		}

		private static class TestClient extends Thread {
			private ThreadLocalTest sn;

			public TestClient(ThreadLocalTest sn) {
				this.sn = sn;
			}

			public void run() {
				for (int i = 0; i < 3; i++) {
					// ④每个线程打出3个序列值
					System.out.println("thread[" + Thread.currentThread().getName() + "] --> sn["
							 + sn.getNextNum() + "]" + " " + sn.getNextNum2());
				}
			}
		}
}
